#ifndef SQL_CONNECTION_POOL_H
#define SQL_CONNECTION_POOL_H

#include <stdio.h>
#include <list>
#include <mysql/mysql.h>
#include <error.h>
#include <string.h>
#include <iostream>
#include <string>

#include "locker.h"
#include "log.h"
using namespace std;

class connection_pool{
public:
    //获取数据库连接
    MYSQL* GetConnection();
    //释放当前数据库连接
    bool ReleaseConnection( MYSQL* conn );
    //获取空闲连接数目
    int GetFreeConn();
    //销毁链接
    void DestroyPool();

    //单例模式
    static connection_pool* GetInstance();

    //初始化
    void init( string url, string User, string PassWord, string DataBaseName, int Port, int MaxConn, int close_log);

private:
    connection_pool();
    ~connection_pool();

    //最大连接数
    int m_maxconn;
    //当前已使用连接数
    int m_Curconn;
    //当前空闲连接数
    int m_Freeconn;
    locker m_lock;
    //连接池
    list<MYSQL*> connList;
    sem m_sem;

public:

    string m_url;//主机地址
    string m_port;//数据库端口号
    string m_user;//登陆数据库用户名
    string m_password;//登陆数据库密码
    string m_databasename;//使用数据库名
    int m_close_log;//日志开关
};

class connectionRAII{
public:
    connectionRAII(MYSQL** conn, connection_pool* connPool);
    ~connectionRAII();
private:
    MYSQL *conRAII;
    connection_pool* poolRAII;
};
#endif // !SQL_CONNECTION_POOL_H